package app

import (
	"win-tools/globals"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/widget"
	"gitee.com/MM-Q/fastlog"
	"github.com/jmoiron/sqlx"
)

// 初始化UI
func initUi(flog *fastlog.FastLog, db *sqlx.DB) (fyne.Window, error) {
	// 创建一个新的应用程序
	myApp := app.NewWithID("com.win-tools.app")

	// 创建一个新的窗口
	myWindows := myApp.NewWindow("win-tools")

	// 设置窗口大小
	myWindows.Resize(fyne.NewSize(300, 400))

	// 设置窗口居中
	myWindows.CenterOnScreen()

	// 设置窗口图标
	icon, loadIconErr := fyne.LoadResourceFromPath("./images/win-tools.png")
	if loadIconErr != nil {
		flog.Errorf("加载图标失败: %s", loadIconErr)
	} else {
		myWindows.SetIcon(icon)
	}

	// 设置窗口关闭事件
	myWindows.SetCloseIntercept(func() {
		flog.Info("关闭窗口...")
		myApp.Quit()
	})

	// 设置窗口内容
	myWindows.SetContent(initHomeTab(flog, myWindows, db))

	return myWindows, nil
}

// 初始化首页标签页
func initHomeTab(flog *fastlog.FastLog, win fyne.Window, db *sqlx.DB) fyne.CanvasObject {
	// 创建按钮
	btnList := initHomeButtons(flog, win, db)

	// 行数网格容器，每行包含3个按钮
	btnBox := container.NewGridWithColumns(3, btnList...)

	// 创建一个滚动视图，将垂直布局放入滚动视图中
	scrollContainer := container.NewVScroll(btnBox)

	// 创建一个边框容器，将按钮网格容器放入边框容器中
	borderContainer2 := container.NewBorder(nil, nil, nil, nil, scrollContainer)

	return borderContainer2
}

// createCmdButton 创建一个按钮
// name: 按钮名称
// cmd: 命令名称
// 返回值: 按钮
func createCmdButton(flog *fastlog.FastLog, win fyne.Window, name string, cmd string) *widget.Button {
	// 创建一个按钮
	return widget.NewButton(name, func() {
		// 执行命令
		err := execCmd(cmd)
		if err != nil {
			// 弹出错误信息
			dialog.ShowError(err, win)
			flog.Errorf("执行命令失败: %s", err)
		}
	})
}

// 初始化首页按钮
func initHomeButtons(flog *fastlog.FastLog, win fyne.Window, db *sqlx.DB) []fyne.CanvasObject {
	// 查询数据库中的命令
	var cmds globals.Commands

	// 查询数据库中的系统命令
	if err := db.Select(&cmds, globals.SystemQueryCmd); err != nil {
		flog.Errorf("查询数据库中的系统命令时发生了错误: %s", err)
	}

	// 创建按钮
	var btns []fyne.CanvasObject
	for _, cmd := range cmds {
		btns = append(btns, createCmdButton(flog, win, cmd.Name, cmd.Cmd))
	}

	return btns
}
